﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QldtSdh.DAL.Models;

namespace QldtSdh.BLL
{
    public partial class BizChuongTrinhDaoTao_HocPhan
    {
        public static List<ChuongTrinhDaoTao_HocPhan> GetList(string guidIdChuongTrinhDaoTao)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var ctdt = db.ChuongTrinhDaoTao_HocPhanDbSet.Where(e =>
                    e.MaChuongTrinhDaoTaoGUID == guidIdChuongTrinhDaoTao)
                    .OrderBy(e => e.HocKy).ThenBy(e => e.KhoiKienThuc).ToList();
                if (ctdt != null && ctdt.Count > 0)
                {
                    for (int i = 0; i < ctdt.Count; i++)
                    {
                        ctdt[i].MaHocPhan_Real = ctdt[i].HocPhan.MaHocPhan;
                        ctdt[i].TenHocPhan = ctdt[i].HocPhan.TenHocPhan;
                        ctdt[i].SoTinChi = ctdt[i].HocPhan.SoTinChi;
                    }
                    return ctdt;
                }
                else
                    return null;
            }
        }

        public static ChuongTrinhDaoTao_HocPhan GetByID(string guidIdCTDT, string guidIdHocPhan)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                return db.ChuongTrinhDaoTao_HocPhanDbSet.Where(e => e.MaChuongTrinhDaoTaoGUID == guidIdCTDT && e.MaHocPhan == guidIdHocPhan).FirstOrDefault();
            }
        }

        public static bool IsExistByID(string guidIdCTDT, string guidIdHocPhan)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                return db.ChuongTrinhDaoTao_HocPhanDbSet.Where(e => e.MaChuongTrinhDaoTaoGUID == guidIdCTDT && e.MaHocPhan == guidIdHocPhan).FirstOrDefault() == null ? false : true;
            }
        }

        public static void Add(ChuongTrinhDaoTao_HocPhan obj, CEMS4UG_DHKHContext db = null)
        {
            if (db == null)
                using (var db2 = CEMS4UG_DHKHContext.GetContext()) Add(obj, db2);
            else
            {
                var ct = db.ChuongTrinhDaoTao_HocPhanDbSet.Where(e => e.MaChuongTrinhDaoTaoGUID == obj.MaChuongTrinhDaoTaoGUID && e.MaHocPhan == obj.MaHocPhan).FirstOrDefault();
                if (ct != null)
                    throw new Exception("Đã tồn tại học phần trong chương trình đào tạo");
                db.ChuongTrinhDaoTao_HocPhanDbSet.Add(obj);
                BizNhatKyHoatDong.LogAndCommitInsert2(obj, obj.ID, LOAIDOITUONG.CHƯƠNG_TRÌNH_ĐÀO_TẠO_HỌC_PHẦN, db);
            }
        }

        public static CODE_RESULT_RETURN Update(ChuongTrinhDaoTao_HocPhan obj)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var ct = db.ChuongTrinhDaoTao_HocPhanDbSet.Where(e => e.MaChuongTrinhDaoTaoGUID == obj.MaChuongTrinhDaoTaoGUID && e.MaHocPhan == obj.MaHocPhan).FirstOrDefault();
                if (ct == null)
                    return CODE_RESULT_RETURN.ThatBai;
                NhatKyHoatDong nhatKy = new NhatKyHoatDong();
                BizNhatKyHoatDong.InitData<ChuongTrinhDaoTao_HocPhan>(nhatKy, ct, ct.MaChuongTrinhDaoTaoGUID + "." + ct.MaHocPhan, LOAIDOITUONG.CHI_TIẾT_CHƯƠNG_TRÌNH_ĐÀO_TẠO, LOAITHAOTAC.Chỉnh_sửa);

                ct.KhoiKienThuc = obj.KhoiKienThuc;
                ct.LaHocPhanBatBuoc = obj.LaHocPhanBatBuoc;
                ct.HocKy = obj.HocKy;
                db.SaveChanges();
                BizNhatKyHoatDong.Add<ChuongTrinhDaoTao_HocPhan>(nhatKy, ct);
                return CODE_RESULT_RETURN.ThanhCong;
            }
        }

        //public static CODE_RESULT_RETURN Delete(string guidIdCTDT, string guidIdHocPhan)
        //{
        //    using (var db = CEMS4UG_DHKHContext.GetContext())
        //    {
        //        /*
        //         * Kiểm tra chương trình đào tào này đã có lớp nào sử dụng chưa
        //         * Nếu chưa thì cho xóa thoải mái
        //         * Nếu đã sử dụng thì kiểm tra học phần đang dự định xóa đã được học chưa
        //         *  -> Nếu chưa thì xóa thoải mái
        //         *  -> Nếu rồi thì không cho phép xóa
        //         */
        //        var hp_dt = db.ChuongTrinhDaoTao_HocPhanDbSet.Where(e => e.MaChuongTrinhDaoTaoGUID == guidIdCTDT && e.MaHocPhan == guidIdHocPhan).FirstOrDefault();
        //        if (hp_dt == null)
        //            return CODE_RESULT_RETURN.ThatBai;
        //        var dsLopKhoaNganhSuDungCTDT = db.LopKhoaNganhDbSet.Where(e => e.KhoaHoc_NganhDaoTao.MaChuongTrinhDaoTaoGUID == guidIdCTDT).Select(e => e.MaLopKhoaNganhGUID).ToList();
        //        if (dsLopKhoaNganhSuDungCTDT.Count > 0)
        //        {
        //            /*
        //             * Trường hợp chương trình đào tạo này đã được ít nhất một lớp sử dụng thì
        //             * Kiểm tra xem học phần cần xóa có học viên nào thuộc một trong những lớp này học chưa
        //             * Nếu có thì không cho phép xóa
        //             */
        //            var dsLopKhoaNganhDaHocHocPhanCanXoa = db.LopHocPhan_HocVienDbSet.Where(e => e.LopHocPhan.HocPhan.MaHocPhanGUID == guidIdHocPhan).Select(e => e.HocVien.LopKhoaNganh.MaLopKhoaNganhGUID).ToList(); ;
        //            foreach (var item in dsLopKhoaNganhDaHocHocPhanCanXoa)
        //                if (dsLopKhoaNganhSuDungCTDT.Contains(item))
        //                    return CODE_RESULT_RETURN.ThatBai;
        //        }
        //        db.ChuongTrinhDaoTao_HocPhanDbSet.Remove(hp_dt);
        //        db.SaveChanges();
        //        NhatKyHoatDong nhatKy = new NhatKyHoatDong();
        //        BizNhatKyHoatDong.InitData<ChuongTrinhDaoTao_HocPhan>(nhatKy, hp_dt, hp_dt.MaChuongTrinhDaoTaoGUID + "." + hp_dt.MaHocPhan, LOAIDOITUONG.CHI_TIẾT_CHƯƠNG_TRÌNH_ĐÀO_TẠO, LOAITHAOTAC.Xóa);
        //        BizNhatKyHoatDong.Add<ChuongTrinhDaoTao_HocPhan>(nhatKy, null);
        //        return CODE_RESULT_RETURN.ThanhCong;
        //    }
        //}

        /// <summary>
        /// Xoá học phần khỏi chương trình đào tạo
        /// </summary>
        /// <param name="maCTDT"></param>
        /// <param name="maHocPhan"></param>
        internal static void DeleteHocPhan(string maCTDT, string maHocPhan)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var oHocPhan = db.ChuongTrinhDaoTao_HocPhanDbSet.Where(e => e.MaChuongTrinhDaoTaoGUID == maCTDT && e.MaHocPhan == maHocPhan).FirstOrDefault();
                if (oHocPhan == null)
                    throw new Exception("Học phần không còn tồn tại trong chương trình đào tạo");

                #region Kiểm tra xem có lớp học phần nào học học phần này theo CTDT?
                var stError = "";
                var lstKhoaHoc_NganhDaoTao = db.KhoaHoc_NganhDaoTaoDbSet.Where(e => e.MaChuongTrinhDaoTaoGUID == maCTDT).ToList();
                foreach (var khoaHoc_NganhDaoTao in lstKhoaHoc_NganhDaoTao)
                {
                    var lstLopKhoaNganh = khoaHoc_NganhDaoTao.ListLopKhoaNganh;
                    foreach (var lopKhoaNganh in lstLopKhoaNganh)
                    {
                        var lstLopHocPhan = db.LopHocPhanDbSet.Where(e => e.MaLopKhoaNganhThamChieu == lopKhoaNganh.MaLopKhoaNganhGUID).ToList();
                        foreach (var lopHocPhan in lstLopHocPhan)
                            if (lopHocPhan.MaHocPhanGUID == maHocPhan)
                            {
                                stError += string.Format("{0}-{1}\r\n", lopHocPhan.MaLopHocPhanGUID, lopHocPhan.TenLopHocPhan);
                            }
                    }
                }
                if (string.IsNullOrEmpty(stError) == false)
                    throw new Exception("Học phần đã được sử dụng cho lớp học phần\r\n" + stError);
                #endregion

                db.ChuongTrinhDaoTao_HocPhanDbSet.Remove(oHocPhan);
                BizNhatKyHoatDong.LogAndCommitDelete2(oHocPhan, oHocPhan.MaHocPhan, LOAIDOITUONG.CHƯƠNG_TRÌNH_ĐÀO_TẠO_HỌC_PHẦN, db);
            }
        }
    }
}
